package mac5855.app.dao;

import java.sql.Timestamp;
import java.util.List;

import javax.persistence.EntityManager;

import mac5855.app.models.Usuario;

public class JpaUsuarioDAO implements UsuarioDAO {

	@Override
	public void create(Usuario newInstance) {
		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();
		em.persist(newInstance);
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);
	}

	@Override
	public void delete(String id) {

		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();
		Usuario usuario = new Usuario();
		usuario.setEmail(id);
		em.remove(usuario);
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);
	}

	@Override
	public Usuario find(Usuario object) {

		return findByEmail(object.getEmail());

	}

	@Override
	public Usuario[] findAll() {

		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();
		List<Usuario> usuarios = em.createQuery("select p from Usuario p").getResultList();
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);

		return (Usuario[]) usuarios.toArray(new Usuario[usuarios.size()]);
	}

	@Override
	public void update(Usuario transientObject) {
		// TODO Auto-generated method stub

	}

	@Override
	public void updateLastLogon(Usuario usuario) {
		// TODO Auto-generated method stub

		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();

		usuario.setUltimoLogin(new Timestamp(usuario.getUltimoLogin().getTime()));

		em.persist(usuario);
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);
	}

	@Override
	public Usuario findByEmail(String email) {
		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();
		Usuario usuario = em.find(Usuario.class, email);
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);

		return usuario;
	}

	@Override
	public Usuario findById(String id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Usuario[] findAllByEmailOrNomeAndTipo(String search, String tipo) {
		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();

		List<Usuario> usuarios;
		if (tipo == null) {
			usuarios = em.createQuery("select p from Usuario p where (p.nome like ? or p.email like ?)").setParameter(
					1, "%" + search + "%").setParameter(2, "%" + search + "%").getResultList();
		} else {
			usuarios = em
					.createQuery("select p from Usuario p where (p.nome like ? or p.email like ?)  and p.tipo = ?")
					.setParameter(1, "%" + search + "%").setParameter(2, "%" + search + "%").setParameter(3, tipo)
					.getResultList();

		}
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);

		return (Usuario[]) usuarios.toArray(new Usuario[usuarios.size()]);

	}

}
